home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 441 / dlibs12 / lmemcpy.s < prev    next >
Text File  |  1990-11-23  |  1KB  |  46 lines

  1. *    char *lmemcpy(dest, source, len)
  2. *        register char *dest;
  3. *        register char *source;
  4. *        register unsigned long len;
  5.  
  6. .text
  7. .globl _lmemcpy
  8. _lmemcpy:
  9.     move.l    4(a7),a1    ; destination
  10.     move.l    8(a7),a0    ; source
  11.     move.l    12(a7),d1    ; number of bytes
  12.     move.l    a1,d0
  13.     btst    #0,d0        ; odd alignment?
  14.     beq    lmemcpy0
  15.     move.b    (a0)+,(a1)+    ; copy first byte
  16.     subq.l    #1,d1        ; and reduce count
  17. lmemcpy0:
  18.     move.l    d1,d2        ; save full count value
  19.     lsr.l    #1,d1        ; convert to word count
  20.     move.w    d1,d0        ; # of extra words to copy
  21.     swap    d1        ; # of 64Kword blocks to copy
  22.     bra    lmemcpy2
  23. lmemcpy1:
  24.     move.w    (a0)+,(a1)+    ; extra bytes copy loop
  25. lmemcpy2:
  26.     dbra    d0,lmemcpy1
  27.     bra    lmemcpy6
  28. lmemcpy3:
  29.     move.l    #$2000,d0    ; 64Kwords = 8K * 4long count
  30.     bra    lmemcpy5
  31. lmemcpy4:
  32.     move.l    (a0)+,(a1)+    ; 64Kword copy loop
  33.     move.l    (a0)+,(a1)+    ; 4 longs at a time
  34.     move.l    (a0)+,(a1)+    ; or, 16 word at a time
  35.     move.l    (a0)+,(a1)+    ; or, 32 bytes at a time
  36. lmemcpy5:
  37.     dbra    d0,lmemcpy4
  38. lmemcpy6:
  39.     dbra    d1,lmemcpy3
  40.     btst    #0,d2        ; extra odd byte to copy?
  41.     beq    lmemcpy7
  42.     move.b    (a0)+,(a1)+    ; copy last byte
  43. lmemcpy7:
  44.     move.l    4(a7),d0    ; return destination pointer
  45.     rts
  46.